//
// Created by 13562 on 2023/6/23.
//

#ifndef CLEVELINGADJUST_SEGMENT_H
#define CLEVELINGADJUST_SEGMENT_H

#include "iostream"
#include "regex"
#include "vector"
#include "string"
#include "sstream"

using namespace std;


class Segment {
public:
	class Station {
	public:
		unsigned int No{};				// 测站编号
		double backsightRange{};		// 后视距
		double foresightRange{};		// 前视距
		double rangeDifference{};		// 视距差
		double rangeAccumulation{};		// 当前视距累积差
		unsigned int backsight1{};		// 后视读数1
		unsigned int foresight1{};		// 前视读数1
		unsigned int backsight2{};		// 后视读数2
		unsigned int foresight2{};		// 前视读数2
		int backsightDiff{};			// 后视互差
		int foresightDiff{};			// 前视互差
		int heightDiff1{};				// 一次高差
		int heightDiff2{};				// 二次高差
		double heightDiffAvg{};			// 平均高差
		double stationLength{};			// 测站长度

		Station() = default;
	};
	string segmentName;					// 测段名称
	string startPointName;				// 起点名称
	string endPointName;				// 终点名称
	vector<Station> stations;			// 测站
	unsigned int stationCount;			// 测站数
	double rangeAccumulation{};			// 测段视距累积差
	double segmentLength{};				// 测段长度
	double segmentHeight{};				// 测段高差

	Segment() = default;
	void inputData(const string& handbook);
	void calcRange();
	void calcHeight();
	void report(const string& report);

	static void calcSegment();
	static void evalSegment(string segmentSummaryFile);
};



#endif //CLEVELINGADJUST_SEGMENT_H
